#include "../include/chip_atmel.h"
//#include <atmel_start.h>

u32 CntSysTick = 0;


void HAL_GPIO_Config(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, uint16_t ModeSel)
{
	switch (ModeSel)
	{
	case MODE_OUTPUT:
		switch (GPIOx)
		{
		case GPIOA:
			DDRA |= GPIO_Pin;
			break;
		case GPIOB:
			DDRB |= GPIO_Pin;
			break;
		case GPIOC:
			DDRC |= GPIO_Pin;
			break;
		case GPIOD:
			DDRD |= GPIO_Pin;
			break;
		case GPIOE:
			DDRE |= GPIO_Pin;
			break;
		case GPIOF:
			DDRF |= GPIO_Pin;
			break;
		case GPIOG:
			DDRG |= GPIO_Pin;
			break;
		case GPIOH:
			DDRH |= GPIO_Pin;
			break;
		case GPIOI:
			//	DDRI |= GPIO_Pin;
			break;
		case GPIOJ:
			DDRJ |= GPIO_Pin;
			break;
		case GPIOK:
			DDRK |= GPIO_Pin;
			break;
		case GPIOL:
			DDRL |= GPIO_Pin;
			break;
		}

		break;
	default:
		switch (GPIOx)
		{
		case GPIOA:
			DDRA &= ~GPIO_Pin;
			break;
		case GPIOB:
			DDRB &= ~GPIO_Pin;
			break;
		case GPIOC:
			DDRC &= ~GPIO_Pin;
			break;
		case GPIOD:
			DDRD &= ~GPIO_Pin;
			break;
		case GPIOE:
			DDRE &= ~GPIO_Pin;
			break;
		case GPIOF:
			DDRF &= ~GPIO_Pin;
			break;
		case GPIOG:
			DDRG &= ~GPIO_Pin;
			break;
		case GPIOH:
			DDRH &= ~GPIO_Pin;
			break;
		case GPIOI:
			//	DDRI &= GPIO_Pin;
			break;
		case GPIOJ:
			DDRJ &= ~GPIO_Pin;
			break;
		case GPIOK:
			DDRK &= ~GPIO_Pin;
			break;
		case GPIOL:
			DDRL &= ~GPIO_Pin;
			break;
		}

		break;
	}
}

void HAL_GPIO_WritePin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
	if (GPIO_PIN_SET == PinState)
	{
		switch (GPIOx)
		{
		case GPIOA:
			PORTA |= GPIO_Pin;
			break;
		case GPIOB:
			PORTB |= GPIO_Pin;
			break;
		case GPIOC:
			PORTC |= GPIO_Pin;
			break;
		case GPIOD:
			PORTD |= GPIO_Pin;
			break;
		case GPIOE:
			PORTE |= GPIO_Pin;
			break;
		case GPIOF:
			PORTF |= GPIO_Pin;
			break;
		case GPIOG:
			PORTG |= GPIO_Pin;
			break;
		case GPIOH:
			PORTH |= GPIO_Pin;
			break;
		case GPIOI:
			//	PORTI |= GPIO_Pin;
			break;
		case GPIOJ:
			PORTJ |= GPIO_Pin;
			break;
		case GPIOK:
			PORTK |= GPIO_Pin;
			break;
		case GPIOL:
			PORTL |= GPIO_Pin;
			break;
		default:
			break;
		}
	}
	else
	{
		switch (GPIOx)
		{
		case GPIOA:
			PORTA &= ~GPIO_Pin;
			break;
		case GPIOB:
			PORTB &= ~GPIO_Pin;
			break;
		case GPIOC:
			PORTC &= ~GPIO_Pin;
			break;
		case GPIOD:
			PORTD &= ~GPIO_Pin;
			break;
		case GPIOE:
			PORTE &= ~GPIO_Pin;
			break;
		case GPIOF:
			PORTF &= ~GPIO_Pin;
			break;
		case GPIOG:
			PORTG &= ~GPIO_Pin;
			break;
		case GPIOH:
			PORTH &= ~GPIO_Pin;
			break;
		case GPIOI:
			//	PORTI &= GPIO_Pin;
			break;
		case GPIOJ:
			PORTJ &= ~GPIO_Pin;
			break;
		case GPIOK:
			PORTK &= ~GPIO_Pin;
			break;
		case GPIOL:
			PORTL &= ~GPIO_Pin;
			break;
		default:
			break;
		}
	}
}


bool HAL_GPIO_ReadPin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin)
{
	switch (GPIOx)
	{
		case GPIOA:
		return !(PINA & GPIO_Pin);
		break;
		case GPIOB:
		return !(PINB & GPIO_Pin);
		break;
		case GPIOC:
		return !(PINC & GPIO_Pin);
		break;
		case GPIOD:
		return !(PIND & GPIO_Pin);
		break;
		case GPIOE:
		return !(PINE & GPIO_Pin);
		break;
		case GPIOF:
		return !(PINF & GPIO_Pin);
		break;
		case GPIOG:
		return !(PING & GPIO_Pin);
		break;
		case GPIOH:
		return !(PINH & GPIO_Pin);
		break;
		case GPIOI:
		//	PORTI &= GPIO_Pin;
		break;
		case GPIOJ:
		return !(PINJ & GPIO_Pin);
		break;
		case GPIOK:
		return !(PINK & GPIO_Pin);
		break;
		case GPIOL:
		return !(PINL & GPIO_Pin);
		break;
		default:
		break;
	}
	return false;
}

void HAL_GPIO_TogglePin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin)
{
	switch (GPIOx)
	{
		case GPIOA:
		PORTA ^= GPIO_Pin;
		break;
		case GPIOB:
		PORTB ^= GPIO_Pin;
		break;
		case GPIOC:
		PORTC ^= GPIO_Pin;
		break;
		case GPIOD:
		PORTD ^= GPIO_Pin;
		break;
		default:
		break;
	}
}
